﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
using namespace std;
#include<assert.h>
#include <time.h>

//struct A {
//	int a[10000];
//};
//
//void TestFunc1(A a) {}
//void TestFunc2(A& a) {}
//
//void TestRefAndValue()
//{
//	A a;
//	// 以值作为函数参数
//	size_t begin1 = clock();
//	for (size_t i = 0; i < 10000; ++i)
//		TestFunc1(a);
//	size_t end1 = clock();
//
//	// 以引用作为函数参数
//	size_t begin2 = clock();
//	for (size_t i = 0; i < 10000; ++i)
//		TestFunc2(a);
//	size_t end2 = clock();
//
//	// 分别计算两个函数运行结束后的时间
//	cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
//	cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
//}


//int main()
//{
//	TestRefAndValue();
//
//	return 0;
//}

//int main()
//{
	// 权限可以平移/缩小 不能放大
	//double d = 12.34;

	////// 类型转换
	////int i = d;

	////int& r1 = d;//错误
	////const int& r2 = d;//可以

	//int x = 0, y = 1;
	//int& r1 = x + y;//错误
	//const int& r2 = x + y;//可以

//	int* p = NULL;
//	int& r = *p;
//	//这里只是记录了*p的地址,并没有对NULL进行访问,不会报错
//	cout << r << endl;//这里才会报错,因为对NULL进行了解引用
//
//	return 0;
//}


//// F.h
//#include <iostream>
//using namespace std;
//inline void f(int i);
//// F.cpp
//#include "F.h"
//void f(int i)
//{
//	cout << i << endl;
//}
//// main.cpp
//#include "F.h"
//int main()
//{
//	f(10);
//	return 0;
//}
//// 链接错误：main.obj : error LNK2019: 无法解析的外部符号 "void __cdecl 
//f(int)" (?f@@YAXH@Z)，该符号在函数 _main 中被引用


//#include <string>
//#include <map>
//int main()
//{
//	std::map<std::string, std::string> m{ { "apple", "苹果" }, { "orange",
//   "橙子" },
//	  {"pear","梨"} };
//	std::map<std::string, std::string>::iterator it = m.begin();
//	while (it != m.end())
//	{
//		//....
//	}
//	return 0;
//}

typedef char* pstring;
int main()
{
	const pstring p1;// 编译成功还是失败？ 
	
	const pstring* p2;// 编译成功还是失败？
	return 0;
}

//#include <string>
//#include <map>
//typedef std::map<std::string, std::string> Map;
//int main()
//{
//	Map m{ { "apple", "苹果" },{ "orange", "橙子" }, {"pear","梨"} };
//	Map::iterator it = m.begin();
//while (it != m.end())
//{
//	//....
//}
//return 0;
//}

int TestAuto()
{
	return 10;
}
int main()
{
	int a = 10;
	auto b = a;
	auto c = 'a';
	auto d = TestAuto();

	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;

	//auto e; 无法通过编译，使用auto定义变量时必须对其进行初始化
	return 0;
}

int main()
{
	int x = 10;
	auto a = &x;
	auto* b = &x;
	auto& c = x;
	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	*a = 20;
	*b = 30;
	c = 40;
	return 0;
}
void TestAuto()
{
	auto a = 1, b = 2;
	auto c = 3, d = 4.0;  // 该行代码会编译失败，因为c和d的初始化表达式类型不同
}

void TestFor()
{
	int array[] = { 1, 2, 3, 4, 5 };
	for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
		array[i] *= 2;

	for (int* p = array; p < array + sizeof(array) / sizeof(array[0]); ++p)
		cout << *p << endl;
}

void TestFor()
{
	int array[] = { 1, 2, 3, 4, 5 };
	//for(a)
	for (auto& e : array)
		e *= 2;

	for (auto e : array)
		cout << e << " ";

	return;
}


#include<iostream>
using namespace std;

class N1
{
public:


private:
	int _a = 10;
};



N1::N1()
{
}

N1 ::~N1()
{
}

void TestFor()
{
	int array[] = { 1,2,3,4,5 };
	for (auto& x : array)
		x *= 2;

	for (auto x : array)
		cout << x << endl;
}

int main()
{
	TestFor();
	return 0;
}